package com.sun.reggie.filter;

import com.alibaba.fastjson.JSON;
import com.sun.reggie.common.BaseContext;
import com.sun.reggie.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;



@WebFilter("/*")
@Slf4j
public class LoginFilter implements Filter {
    //路径匹配器，支持通配符
    AntPathMatcher antPathMatcher = new AntPathMatcher();

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;  //获取session中值
        HttpServletResponse response = (HttpServletResponse) servletResponse; //重定向

        //1、获取本次请求的URI
        String requestURI = request.getRequestURI();

//        {}占位符
        log.info("接受到的请求路径:{}", requestURI);

        //定义不需要处理的请求路径--白名单
        String[] urls = new String[]{
                "/employee/login",  // 登陆页 直接放行
                "/employee/logout",//注销页 直接放行
                "/backend/**", //所有的pc端的 前端资源 放行
                "/front/**" ,//所有的移动端 前端资源 放行
                "/user/sendMsg",//移动端发送验证码放行
                "/user/login",//移动端登录放行
                "/doc.html",
                "/webjars/**",
                "/swagger-resources",
                "/v2/api-docs"
        };

        log.info("接受到的请求路径:{}", requestURI);
        //2、判断本次请求是否需要处理
        boolean ispass = check(requestURI, urls);
        log.info("匹配是否成功", ispass);
        //3、如果不需要处理，则直接放行
        if (ispass) {
            //         filterChain.doFilter 放行
            filterChain.doFilter(request, response);
//            直接返回该方法，下面的代码不要执行了
            return;
        }else{
            //4、判断登录状态，如果已登录，则直接放行
            Object employeeid = request.getSession().getAttribute("employee");

//        如果用户id不等于空，说明已经登陆过，直接放行
            if (employeeid != null) {
                log.info("用户已经登录，直接放行");
                BaseContext.setCurrentId((Long) employeeid);
                filterChain.doFilter(request, response);
                //            直接返回该方法，下面的代码不要执行了
                return;
            }

            Object userid = request.getSession().getAttribute("user");
//        如果用户id不等于空，说明已经登陆过，直接放行
            if (userid != null) {
                log.info("用户已经登录，直接放行");
                BaseContext.setCurrentId((Long) userid);
                filterChain.doFilter(request, response);
                //            直接返回该方法，下面的代码不要执行了
                return;
            }
            //5、如果未登录则返回未登录结果，通过输出流方式向客户端页面响应数据

//        JSON.toJSONString 将对象 转成 JSON字符串 给前端使用  返回的数据一定是NOTLOGIN  且code 为0
            response.getWriter().write(JSON.toJSONString(R.error("NOTLOGIN")));
        }



    }


    private boolean check(String uri, String[] urls) {

        for (String url : urls) {
            boolean pass = antPathMatcher.match(url, uri);

            if (pass) {// 如果匹配，就直接返回true
              return true;
            }
        }

        return false;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void destroy() {

    }
}


